package com.arina.onepagesmarthome;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class helperClass {
	private static final int sizeOfIntInHalfBytes = 2;
	  private static final int numberOfBitsInAHalfByte = 4;
	  private static final int halfByte = 0x0F;
	  private static final char[] hexDigits = { 
		    '0', '1', '2', '3', '4', '5', '6', '7', 
		    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
		  };
	public static String decToHex(int dec) {
	    StringBuilder hexBuilder = new StringBuilder(sizeOfIntInHalfBytes);
	    hexBuilder.setLength(sizeOfIntInHalfBytes);
	    for (int i = sizeOfIntInHalfBytes - 1; i >= 0; --i)
	    {
	      int j = dec & halfByte;
	      hexBuilder.setCharAt(i, hexDigits[j]);
	      dec >>= numberOfBitsInAHalfByte;
	    }
	    return hexBuilder.toString(); 
	  }
//	public static void updateStatus(final Handler mHandler, Relay[] m_arrRelay) {
//		
//		Thread th=new Thread(){
//			Relay[] arrRelay=m_arrRelay;
//			public void run(){
//				for(int i=0;i<arrRelay.length;i++)
//				{
//					arrRelay[i].readStatusHTTP();
//				}
//
//				mHandler.post(new Runnable() {
//
//					@Override
//					public void run() {
//						for(int positionRelay=0;positionRelay<arrRelay.length;positionRelay++)
//						{
//							if(arrRelay[positionRelay].Status!=null)
//							{
//								//updateUI(arrRelay[positionRelay].Status,positionRelay);
//								for(int i=0;i<arrRelay[positionRelay].ArrButton.length;i++)
//								{
//									if(arrRelay[positionRelay].ArrButton[i]!=null)
//									{
//										ToggleButton currButton=arrRelay[positionRelay].ArrButton[i];
//										currButton.setChecked(!arrRelay[positionRelay].Status[i]);
//									}
//								}
//							}
//						}
//
//					}
//				});
//			};
//		};
//		th.start();
//	}	
//	public static void updateUI(char[] arrayResponse, myToggleButton[] arrToggle2)
//	{
//		String header="SMARTHOUSE0034";
//		char[] arrHeader=header.toCharArray();
//		int t=22;
//		if(arrayResponse.length>=arrToggle2.length+t)
//		{
//			if(compareByteArray(arrayResponse, arrHeader))
//			{
//				if(arrayResponse!=null)
//				{
//					for(int i=t;i<arrToggle2.length+t;i++)
//					{
//						if(arrToggle2[i-t]!=null)
//						{
//							if(arrayResponse[i]=='1'&& arrToggle2[i-t].isChecked()==false)
//							{
//								
//									arrToggle2[i-t].setChecked(true);
//							}
//							else if(arrayResponse[i]=='0'&& arrToggle2[i-t].isChecked()==true )
//							{
//								arrToggle2[i-t].setChecked(false);
//							}
//						}
//					}	
//				}
//			}
//			
//		}
//	}
//	public static void updateUI(byte[] arrayResponse, myToggleButton[] arrToggle2)
//	{
//		String header="SMARTHOUSE0034";
//		char[] arrHeader=header.toCharArray();
//		byte[] arrByteHeader=new byte[arrHeader.length];
//		for(int i=0;i<arrHeader.length;i++)
//		{
//			arrByteHeader[i]=(byte)arrHeader[i];
//		}
//		int t=22;
//		if(arrayResponse.length>=arrToggle2.length+t)
//		{
//			if(compareByteArray(arrayResponse, arrByteHeader))
//			{
//				if(arrayResponse!=null)
//				{
//					for(int i=t;i<arrToggle2.length+t;i++)
//					{
//						if(arrToggle2[i-t]!=null)
//						{
//							if(arrayResponse[i]=='1'&& arrToggle2[i-t].isChecked()==false)
//							{
//								
//									arrToggle2[i-t].setChecked(true);
//							}
//							else if(arrayResponse[i]=='0'&& arrToggle2[i-t].isChecked()==true )
//							{
//								arrToggle2[i-t].setChecked(false);
//							}
//						}
//					}	
//				}
//			}
//			
//		}
//	}
//	
//	public static void updateUIUDP(byte[] arrayResponse, myToggleButton[] arrToggle2)
//	{
//		int t=14;//vi tri so kenh
////		int nChannel=arrayResponse[14];//so kenh
//		for(int i=t+1;i<arrayResponse[14]+1+14;i++)
//		{
//			int y=i-(t+1);
//			if(arrToggle2[y]!=null)
//			{
//				if(arrayResponse[i]==100&& arrToggle2[y].isChecked()==false)
//				{
//
//					arrToggle2[y].setChecked(true);
//				}
//				else if(arrayResponse[i]==0&& arrToggle2[y].isChecked()==true )
//				{
//					arrToggle2[y].setChecked(false);
//				}
//			}
//		}
//
//
//	}
	public static Boolean compareByteArray(char[] arrayResponse, char[] arrHeader) {
		for(int i=0;i<arrHeader.length;i++)
		{
			if(arrHeader[i]!=arrayResponse[i])
				return false;
		}
		return true;
	}
	public static Boolean compareByteArray(byte[] arrayResponse, byte[] arrHeader) {
		for(int i=0;i<arrHeader.length;i++)
		{
			if(arrHeader[i]!=arrayResponse[i])
				return false;
		}
		return true;
	}
	public static String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
	    Reader reader = null;
	    reader = new InputStreamReader(stream, "UTF-8");        
	    char[] buffer = new char[len];
	    reader.read(buffer);
	    return new String(buffer);
	}
	public static char[] processResponse(String[] setServerString) {
		// TODO Auto-generated method stub
		String status_string= setServerString[0].substring(22);
		char[] charResponse=status_string.toCharArray();
        return charResponse; 
	}
	public static byte[] hexStringToByteArray(String s) {
	    int len = s.length();
	    byte[] data = new byte[len / 2];
	    for (int i = 0; i < len; i += 2) {
	        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
	                             + Character.digit(s.charAt(i+1), 16));
	    }
	    return data;
	}
	
	public static byte[] makeDataToSend(COMMAND_TYPE cmd_type,int SUBNET_ID,int DEVICE_ID,int DEVICE_CHANNEL ,int BRIGHTNESS_VARIABLE,
			String mUsername,String mPassword,String currIP,int mPort ) {
		// TODO Auto-generated method stub
		byte code;
		switch (cmd_type) {
		case ON_OFF:
			code=0x31;
			break;
		case REVERSE:
			code=0x1c;
			break;
		case READ_STATUS:
			code=0x33;
			break;

		default:
			code=0x33;
			break;
		}
		byte[] array_byte_username= mUsername.getBytes();
		byte[] array_byte_password=mPassword.getBytes();
		byte[] headMsg = new byte[]
				{
	        (byte) 83,
	        (byte) 77,
	        (byte) 65,
	        (byte) 82,
	        (byte) 84,
	        (byte) 72,
	        (byte) 79,
	        (byte) 85,
	        (byte) 83,
	        (byte) 69};
		
	    byte[] middleMsg=new byte[]{    
	        (byte)0x00,
	        code,
	        (byte)SUBNET_ID,
	        (byte)DEVICE_ID
	       
	      };
	    
	    byte[] tailMsg=new byte[]{
	    		 (byte)DEVICE_CHANNEL,
	 	        (byte)BRIGHTNESS_VARIABLE,
	 	        (byte)0x00,
	 	        (byte)0x00
	    };
	    byte[] udpMsg=new byte[headMsg.length+array_byte_username.length+array_byte_password.length+middleMsg.length+tailMsg.length];
		System.arraycopy(headMsg, 0, udpMsg, 0, headMsg.length);
		System.arraycopy(array_byte_username, 0, udpMsg, headMsg.length,array_byte_username.length);
		System.arraycopy(array_byte_password, 0, udpMsg, headMsg.length+array_byte_username.length, array_byte_password.length);
		System.arraycopy(middleMsg, 0, udpMsg, headMsg.length+array_byte_username.length+array_byte_password.length, middleMsg.length);
		
		if(cmd_type!=COMMAND_TYPE.READ_STATUS)
			System.arraycopy(tailMsg, 0, udpMsg, headMsg.length+array_byte_username.length+array_byte_password.length+middleMsg.length, tailMsg.length);
	    
		DatagramSocket ds=null;
		try{
		ds= new DatagramSocket();
		
		
		DatagramPacket dp=new DatagramPacket(udpMsg,udpMsg.length,InetAddress.getByName(currIP),mPort);
		ds.send(dp);
		}
		catch(SocketException e)
		{
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(ds!=null)
				ds.close();
		}
		return udpMsg;
	}
}
